package com.changjiang.luban.utils.result;

import com.changjiang.luban.utils.ContrastUtils;
import com.changjiang.luban.utils.data.Page;
import lombok.Data;

import java.io.Serializable;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * Description:
 *
 * @author changjiang
 * Date: 2018-03-28
 * Time: 11:34
 */
@Data
public class ApiResult implements Serializable{

    private static final long serialVersionUID = -4323588904283909749L;

    /** 结果码 */
    private Integer code;

    /** 结果说明 */
    private String msg;

    /** 返回数据 */
    private Object  data;

    /**
     * 回调地址
     */
    private String callback;

    /**
     * 默认构造函数
     */
    public ApiResult() {}

    /**
     * 操作成功返回方法
     * @param object 返回结果
     * @return
     */
    public static ApiResult success(Object object){
        ApiResult result = new ApiResult();
        if(object!=null){
            if(object instanceof List){
                if(((List) object).size()<=0){
                    result.setResultCode(ApiResultCode.DATA_NONE);
                }else {
                    result.setResultCode(ApiResultCode.SUCCESS);
                }
            }else {
                result.setResultCode(ApiResultCode.SUCCESS);
            }
        }else{
            result.setResultCode(ApiResultCode.DATA_NONE);
        }
        result.setData(object);
        return result;
    }

    public static ApiResult success(Page page){
        ApiResult result = new ApiResult();
        if(page.getRowList()!=null && page.getRowList().size()>0){
            result.setResultCode(ApiResultCode.SUCCESS);
        }else{
            result.setResultCode(ApiResultCode.DATA_NONE);
        }
        result.setData(page);
        return result;
    }

    /**
     * 单个对象数据返回处理方法
     * @param o 数据对象
     * @return ApiResult接口返回对象
     */
    public static ApiResult successResultObject(Object o){
        ApiResult apiResult = ApiResult.success();
        //判断对象是否为空指针
        if(ContrastUtils.isNull(o)){
            //返回数据不存在
            apiResult.setResultCode(ApiResultCode.DATA_NONE);
        }else{
            apiResult.setData(o);
        }
        return apiResult;
    }

    /**
     * 集合对象数据返回处理方法
     * @param list 集合数据
     * @return ApiResult接口返回对象
     */
    public static ApiResult successResultList(List list){
        ApiResult apiResult = ApiResult.success();
        //判断对象是否为空指针
        if(ContrastUtils.listIsNullAndSize0(list)){
            apiResult.setData(list);
        }else{
            //返回数据不存在
            apiResult.setResultCode(ApiResultCode.DATA_NONE);
        }
        return apiResult;
    }

    /**
     * 分页对象数据返回处理方法
     * @param page 分页对象
     * @return ApiResult接口返回对象
     */
    public static ApiResult successResultPage(Page page){
        ApiResult apiResult = ApiResult.success();
        //判断对象是否为空指针
        if(ContrastUtils.listIsNullAndSize0(page.getRowList())){
            apiResult.setData(page);
        }else{
            //返回数据不存在
            apiResult.setResultCode(ApiResultCode.DATA_NONE);
        }
        return apiResult;
    }

    /**
     * 操作成功返回静态方法
     * @return ApiResult
     */
    public static ApiResult success(){
        ApiResult result = new ApiResult();
        result.setResultCode(ApiResultCode.SUCCESS);
        return result;
    }

    /**
     * 操作成功返回静态方法
     * @return ApiResult
     */
    public static ApiResult success(boolean bool){
        ApiResult result = new ApiResult();
        if(bool){
            result.setResultCode(ApiResultCode.SUCCESS);
        }else{
            result.setResultCode(ApiResultCode.OPERATION_FAILED);
        }
        return result;
    }

    public static ApiResult failure(ApiResultCode code){
        ApiResult result = new ApiResult();
        result.setResultCode(code);
        return result;
    }

    public void setResultCode(ApiResultCode code) {
        this.code = code.code();
        this.msg = code.message();
    }
}
